package org.company.earth.spring;

import java.io.Serializable;

import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.company.earth.App;
import org.company.earth.anotation.Auditable;
import org.springframework.stereotype.Service;

@Service
@Aspect
public class AnotationAppAspect {
	
	private static Logger logger = Logger.getLogger(AnotationAppAspect.class);
	
    /**
     * execution只能够切面指定类定义的方法，继承的方法无法切面
     * @method helloAspect
     */
    @AfterReturning(pointcut="execution(* org.company.earth.App.say*()) && target(app)")
    public void helloAspect(App app) {
        System.out.println("count == " + app.getCount());
        System.out.println("aspect,returning aspect");
    }
    
    /**
     * 
     * 功能描述：pintcut指定任何say开头的方法<br>  
     * 方法名称：beforeHelloSay<br>  
     * 条件：(这里描述这个方法适用条件 – 可选)<br>   <br>  
     * void<br>  
     * @author<br>  
     * @update:[2013年12月12日-上午9:43:32][更改人姓名][变更描述]<br>  
     * @exception
     */
    @Before("execution(* say*())")
    public void beforeHelloSay() {
        System.out.println("aspect,before 'say*' pointcut");
    }
    
    /**
     * 
     * 功能描述：指定com.founder.barcode.common.kaiser包下面的所有类<br>  
     * 方法名称：beforeHello<br>  
     * 条件：(这里描述这个方法适用条件 – 可选)<br>   <br>  
     * void<br>  
     * @author<br>  
     * @update:[2013年12月12日-上午9:42:30][更改人姓名][变更描述]<br>  
     * @exception
     */
    @Before("execution(* org.company.earth.solar.*.say*())")
    public void beforeHello() {
        System.out.println("aspect,before aspect");
    }
    
    /**
     * 
     * 功能描述：com.founder.barcode包或者子包下面的任何方法<br>  
     * 方法名称：afterHello<br>  
     * 条件：(这里描述这个方法适用条件 – 可选)<br>   <br>  
     * void<br>  
     * @author<br>  
     * @update:[2013年12月12日-上午9:42:01][更改人姓名][变更描述]<br>  
     * @exception
     */
    @After("execution(* org.company.earth..*.say*())")
    public void afterHello() {
        System.out.println("aspect,after aspect");
    }
    
    /**
     * point可以获取参数
     * @method parameterHello
     * @param point
     */
    @Before("execution(* say*(..))")
    public void parameterHello(JoinPoint point) {
        Object[] args = point.getArgs();
        System.out.println("App.count=" + (args.length > 0 ? args[0] : null));
    }
    
    @Before("execution(* say*(..)) && args(something,count)")
    public void parameterSay(Serializable something,Serializable count) {
        System.out.println("before,arguments is " + something);
    }
    
    @Before("@target(auditable) && execution(* say*())")
    public void annotationSay(Auditable auditable) {
        String value = auditable.value();
        System.out.println("aspect,annotation value is " + value);
    }
    
    @Before("target(org.company.earth.App)")
    public void targetSay() {
        System.out.println("before target");
    }
    
    @Before("within(org.company.earth..*) and args(something,count)")
    public void withinTest(String something,Integer count) {
        System.out.println("something==" + something);
        System.out.println("within aop");
    }
    
    public Object doAround(ProceedingJoinPoint process) throws Throwable {
    	long begin = System.nanoTime();
    	Object o = process.proceed();
    	long end = System.nanoTime();
    	return o;
    }
}
